(1/8)Movement——角色移动

今天开始准备翻译一下官方教程的GML版,这套教程虽然简单,但是对于初学者而言是不可多得的入门教材,一步一步的指导新手通过基本的一些操作来完成一个具有一定完成度的游戏,游戏是一个90度俯视视角的射击类游戏。

这套教程是全套一共8章,今天第一章的内容主要是介绍如何创建精灵、对象,以及操作对象进行运动。

PS.不光有文字版本哦,点击阅读原文可以到B站看我配音的中文版视频XD

精灵和对象创建


首先我们创建一个玩家的精灵(Sprites),如上图所示,只需要在右侧资源树中选中Sprites菜单然后单击右键选择Create即可新建一个精灵,然后GMS2会自动打开一个精灵编辑窗口,如下图:

这个窗口可以按住鼠标随意拖放合适的位置,也可以按住Ctrl健然后是用滚轮来进行缩放查看。
首先我们要给精灵起一个名字,通常我们会给不同的资源设定一些前缀用于区分,在这里我们使用“spr”作为精灵的前缀,同时用“_”分割前缀和名称,要注意起名的时候只能使用字母、数字和下划线。
然后我们要给这个精灵设置用于展示的图片,点击“Import”按钮会打开一个窗口,可以在其中选择需要指定给这个精灵的图片

我们也可以导入GIF动画或多张序列帧图片来给精灵设置动画效果,不过在本章暂时不使用这个功能,在后续的教程中会教导大家使用动画功能。
我们还可以设置精灵的原点,这个原点就是之后在场景中生成时所设置点的位置,可以直接在图片上用鼠标指定,或通过下图的下拉选项菜单选择预设的位置,在这里我们选择“Middle Center”,就是在图片的最中央。

接下来我们需要创建一个玩家对象,同样在右侧资源树中找到Object的菜单然后右键选择Create

然后会在刚才的精灵编辑窗口下方弹出一个对象编辑窗口:

跟精灵一样,我们首先命名这个对象,同样为了便于区分使用“obj”作为前缀,然后我们要把这个玩家对象跟之前创建的玩家精灵关联起来,点击“No Spite”处会出现一个窗口,可以从中选择项目中已经创建的精灵,这里我们选择刚刚创建单位“spr_player”的那个精灵


现在我们的玩家对象基本已经有了个雏形,虽然还没有处理任何的逻辑,但是一个基本的对象已经完成了,我们可以把它放到我们的游戏中实际看看到底是怎样的,我们回到右侧资源树中找到room这个选项,然后展开,我们会看到已经有一个默认的“room0”存在了,这是因为GMS2游戏全部基于游戏场景,因此默认至少会有一个场景存在,我们双击这个“room0”就会进入场景编辑器的界面

场景是整个游戏的基础,我们会在场景中设置背景图片,组织各种对象来生成我们所看到的游戏,现在我们用鼠标从右边把刚刚做好的玩家对象直接拖入场景中,如果按住Alt键直接在场景中单击鼠标会直接生成当前选中的对象。

放置好我们需要的玩家对象之后,我们可以单击左上角的Play按钮来运行一下游戏试试看效果:

经过短暂的编译之后游戏就会自动启动,这时候我们只能看到一个黑色的背景上有一个孤零零的飞船,而不能进行任何的操作,因为我们没有写任何有关的代码

动起来

让我们回到GMS2中,打开玩家对象的编辑窗口,现在要开始添加一些事件和功能性代码让我们的飞船动起来。
我们可以看到在对象编辑窗口的右侧有一个事件窗口,而所谓的事件就是我们用来进行逻辑判断最基本的元素,而我们在游戏中所说的逻辑就是:

当某件事情触发时,执行某个特定的命令


单击“Add Event”会打开一个事件列表,这些是GMS2默认的事件列表,其中我们这次要使用的是Step这个事件,这个事件比较特殊,它会在游戏每一帧都自动触发一次,可以理解成在游戏过程中在不断触发,如果你在游戏设置中把FPS设置为60帧/秒,那就意味着这个事件会在一秒之内连续触发60次。

当我们选择Step事件后,会自动在右侧打开一个新的较大的窗口,这个窗口就是用来编写执行的命令的代码的窗口

在这里我们写下一行:

x = x + 4 ;

你会发现这个x是绿色的,这说明这是对象的自带属性,这个x就是对象在场景中所处位置的水平位置,我们首先要让这个对象发生一个水平向右的位移,那就是要让这个对象的x值越来越大,所以这一行就代表着每个step事件被触发时,对象的x值都会增加4个像素,而由于step事件会不断触发,这个对象也就会不断向右进行移动了。
当写完这行代码以后你可以再次运行游戏来预览一下这个运动的效果,你会发现游戏启动后飞船会一直向右移动,直到飞出画面,因为我们没有设置任何停止或控制的命令,这个对象就会永远向右移动下去。

可操作

但刚才的移动我们依然无法操作,接下来我们要增加一些代码,以确保我们可以控制这个精灵的移动。
我们的目的是写一段内容,确保当我们在键盘上按下向右的方向键时,飞船向右进行移动,当我们松开按键时,飞船就停住不动
那么我们就需要引入”if“这个函数,如下图所示:

if  (keyboard_check(vk_right)) x = x + 4 ;

这一行内容代表

假如  ( 检测到被按下 ( 右方向键 ) ) x = x + 4 ;

再直白的翻译就是

假如 ( ( 右方向键 ) 检测到被按下时 ) x = x + 4 ;

在这里我们把需要执行的命令”x=x+4“直接放在了if的条件之后,这在GML语言中是可行的,另外还有一种写法,是把命令用“{}”包围起来放到if方法下方:

if  (keyboard_check(vk_right)) 
{
    x = x + 4 ;
}

这时候我们再启动游戏测试一下,就会发现已经达成了我们的目标,只有在按下右方向键的时候飞船才会向右移动了。
接下来我们重复刚才的步骤,把上下左右的方向操作全部完成即可:

这个操作我们可以直接复制刚才的代码,然后在其中进行一些修改,首先把按键的判断分别指向上下左右四个不同的方向键,然后把按下方向键以后需要执行的命令进行调整。
这里我们要明确一个概念,游戏中场景的x,y的原点默认是在左上角的,因此x越大意味着越向右,越小则越向左,y值越大意味着越向画面下方,越小则越向上,因此数值的加减关系务必定义正确。

if  (keyboard_check(vk_right)) x = x + 4 ;
if  (keyboard_check(vk_left)) x = x - 4 ;
if  (keyboard_check(vk_up)) y = y - 4 ;
if  (keyboard_check(vk_down)) y = y + 4 ;

当以上代码都完成后,再次启动游戏进行预览,我们会发现现在可以通过上下左右四个按键来任意控制飞船的移动了。

飞船的角度

最后我们要设置让飞船能时刻保持正面朝着鼠标所处的位置,这意味着我们需要随时调整精灵图像的角度,在GMS2中我们有一个默认的属性“image_angle"来控制这个角度,然后还有一个自带的函数”point_direction"(点对点夹角)可以设置点对点的夹角来实现我们需要的效果:

如上图所示,image_angle是对象自身图像的角度,我们把这个角度用“点对点夹角”的函数来进行控制,当我们输入这个函数以后,在输入参数时,在代码编辑器底部我们会看到一个提示“point_direction(x1,y1,x2,y2)”,这代表这个函数需要4个参数,分别是x1、y1、x2、y2,这是两个点的x、y值,这个函数计算的是两点所连成的直线与水平线之间的夹角,而我们现在要设置的两个点就是对象自身的原点和鼠标所处的位置,因此我们填入以下内容

image_angle = point_direction(x,y,mouse_x,mouse_y)

其中x,y分别是对象自身原点的x,y值,mouse_x和mouse_y则是自带属性中鼠标所处的位置的x,y值,因此这就意味着这个对象的图片的角度要时刻与这两点的夹角保持一致,就刚好能满足我们所要达成的目的——让飞船的正面时刻朝向鼠标所在的位置。

这一章是官方系列教程中的第一章,只是简单介绍了物体运动的操作方式,后续还会有更多内容希望大家耐心等待:)

2017-05-24 20:32
Comments
Write a Comment